package com.lemobar.pay.model.alipay.request;

import com.lemobar.pay.constants.AliPayConstants;
import com.lemobar.pay.enums.AliPayMethodEnum;
import com.lemobar.pay.model.alipay.BusinessParams;
import com.lemobar.pay.model.alipay.ExtendParams;
import com.lemobar.pay.model.alipay.GoodsDetail;
import lombok.Data;

import java.util.List;

/**
 * 支付宝 统一收单交易创建接口 的请求
 * alipay.trade.create(统一收单交易创建接口)
 * https://docs.open.alipay.com/api_1/alipay.trade.create
 */
@Data
public class AliPayTradeCreateRequest {

    /**
     * app_id
     * 支付宝分配给开发者的应用ID
     */
    private String appId;

    /**
     * 接口名称
     */
    private String method = AliPayMethodEnum.ALIPAY_TRADE_CREATE.getCode();

    /**
     * 仅支持JSON
     */
    private String format = AliPayConstants.FORMAT_JSON;

    /**
     * 请求使用的编码格式，如utf-8,gbk,gb2312等
     */
    private String charset = AliPayConstants.CHARSET_UTF8_LOWER;

    /**
     * 生成签名字符串所使用的签名算法类型，目前支持RSA2和RSA，推荐使用RSA2
     */
    private String signType = AliPayConstants.SIGN_TYPE_RSA2;

    /**
     * 商户请求参数的签名串，详见签名 https://docs.open.alipay.com/291/105974
     */
    private String sign;

    /**
     * 发送请求的时间，格式"yyyy-MM-dd HH:mm:ss"
     */
    private String timestamp;

    /**
     * 调用的接口版本，固定为：1.0
     */
    private String version = AliPayConstants.API_VERSION;

    /**
     * 支付宝服务器主动通知商户服务器里指定的页面http/https路径。
     */
    private String notifyUrl;

    /**
     * 详见应用授权概述 https://opendocs.alipay.com/isv/10467/xldcyq
     */
    private String appAuthToken;

    /**
     * 请求参数的集合，最大长度不限，除公共参数外所有请求参数都必须放在这个参数中传递，具体参照各产品快速接入文档
     */
    private String bizContent;

    @Data
    public static class BizContent {
        /**
         * 商户订单号。
         * 由商家自定义，64个字符以内，仅支持字母、数字、下划线且需保证在商户端不重复。
         * (必选)
         */
        private String outTradeNo;

        /**
         * 订单总金额，单位为元
         * (必选)
         */
        private Double totalAmount;

        /**
         * 订单标题
         * (必选)
         */
        private String subject;

        /**
         * 产品码。
         * 商家和支付宝签约的产品码。 枚举值（点击查看签约情况）：
         * FACE_TO_FACE_PAYMENT：当面付产品；
         * 默认值为FACE_TO_FACE_PAYMENT。
         */
        private String productCode;

        /**
         * 卖家支付宝用户ID。
         */
        private String sellerId;

        /**
         * 买家支付宝用户ID
         */
        private String buyerId;

        /**
         * 订单附加信息。
         */
        private String body;

        /**
         * 订单包含的商品列表信息，json格式。
         */
        private List<GoodsDetail> goodsDetail;

        /**
         * 订单绝对超时时间。
         * 格式为yyyy-MM-dd HH:mm:ss。
         */
        private String timeExpire;

        /**
         * 订单相对超时时间。从交易创建时间开始计算。
         */
        private String timeoutExpress;

        //private SettleInfo settleInfo;    // 描述结算信息，json格式。

        private ExtendParams extendParams;    // 业务扩展参数

        private BusinessParams businessParams;    // 商户传入业务信息，具体值要和支付宝约定，应用于安全，营销等参数直传场景，格式为json格式

        /**
         * 可打折金额。
         */
        private Double discountableAmount;

        /**
         * 不可打折金额。
         */
        private Double undiscountableAmount;

        /**
         * 商户门店编号。
         * 指商户创建门店时输入的门店编号。
         */
        private String storeId;

        /**
         * 商户操作员编号。
         */
        private String operatorId;

        /**
         * 商户机具终端编号。
         */
        private String terminalId;

        //private LogisticsDetail logisticsDetail;  // 物流信息

        //private ReceiverAddressInfo receiverAddressInfo;  // 收货人及地址信息


        // ****************************【下面都没用到 -- 要注释】****************************************

        /**
         * 买家支付宝账号(和buyer_id不能同时为空)
         * api文档上只剩buyer_id了，推荐使用buyer_id
         *
         */
        //private String buyerLogonId;

        /**
         * 付款码
         */
        private String authCode;

        /**
         * 是否异步支付，传入true时，表明本次期望走异步支付，会先将支付请求受理下来，再异步推进。商户可以通过交易的异步通知或者轮询交易的状态来确定最终的交易结果
         */
        private Boolean isAsyncPay;
    }
}
